﻿// class16.7.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <iomanip>
using namespace std;

void Hack()
{
	unsigned long long x = 0;
	for (int i = 0; true; i++)
	{
		if (i % 100000000 == 0)
		{
			system("cls");
			std::cout << "\n■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n";
			std::cout << "\n 你的系统已经被我们拿下! hacked by 黑兔档案局:[ID:000001 ]\n";
			std::cout << "\n              加群:868267304 解除\n";
			std::cout << "\n\\>正在传输硬盘数据....已经传输" << x++ << "个文件......\n\n";

			std::cout << std::setfill('>') << std::setw(x % 60) << "\n";

			std::cout << "\n\\>摄像头已启动!<==============\n\n";

			std::cout << std::setfill('#') << std::setw(x % 60) << "\n";

			std::cout << "\n\\>数据传输完成后将启动自毁程序!CPU将会温度提升到200摄氏度\n";

			std::cout << "\n■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n";
		}
	}
}

int GetAge()
{
	int rt;
	std::cout << "请输入学员的年龄:";
	std::cin >> rt;
	return rt;
}

int count()
{
	int i{};
	int total{};
	int age[10]{};
	do
	{
		age[i] = GetAge();
		total += age[i];
		//将AGE[I]保存到数据库中
	} while (age[i++]);
	return total;
}

int main()
{
	std::cout << "======= 驴百万学院 学员总年龄统计计算系统 =====\n";
	std::cout << "\n                API:" << Hack << std::endl;
	std::cout << "\n[说明:最多输入10个学员的信息,当输入0时代表输入结束]\n\n";
	std::cout << "\n驴百万学院的学员总年龄为:" << count();
}
//栈：0-9位为函数，10位为判断，11位为total，12位为i，13位为旧EBP地址，14位为跳转函数地址
//攻击：第13位输入13，第14位输入攻击函数
//分析：13位输入13能让原本为12的i通过接下来while循环里的自增加1变成14，然后输入hack函数的API覆盖到跳转函数地址上，然后输入0结束，这样不影响旧EBP地址，又能执行hack函数
//如果不输入13：小于13的话会覆盖跳转函数地址导致程序提前结束，大于13的话可能会造成栈错误